home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 71.zip / BS1 part 71 / AmosPro2.0_d5.adf / Extensions / |compact.s < prev    next >
Text File  |  1992-09-28  |  16KB  |  718 lines

  1. ;---------------------------------------------------------------------
  2. ;    **   **   **  ***   ***   ****     **    ***  **  ****
  3. ;   ****  *** *** ** ** **     ** **   ****  **    ** **  **
  4. ;  **  ** ** * ** ** **  ***   *****  **  **  ***  ** **
  5. ;  ****** **   ** ** **    **  **  ** ******    ** ** **
  6. ;  **  ** **   ** ** ** *  **  **  ** **  ** *  ** ** **  **
  7. ;  **  ** **   **  ***   ***   *****  **  **  ***  **  ****
  8. ;---------------------------------------------------------------------
  9. ; AMOSPro Picture compactor extension source code,
  10. ; By François Lionet
  11. ; AMOS, AMOSPro and AMOS Compiler (c) Europress Software 1990-1992
  12. ; To be used with AMOS1.3 and over
  13. ;--------------------------------------------------------------------- 
  14. ; This file is public domain
  15. ;---------------------------------------------------------------------
  16. ; Please refer to the _Music.s file for more informations
  17. ;---------------------------------------------------------------------
  18. *
  19. Version        MACRO
  20.         dc.b    "1.0"
  21.         ENDM
  22. *
  23. *
  24. ExtNb        equ    2-1
  25. *
  26.         Include "|AMOS_Includes.s"
  27. *
  28. Start        dc.l    C_Tk-C_Off
  29.         dc.l    C_Lib-C_Tk
  30.         dc.l    C_Title-C_Lib
  31.         dc.l    C_End-C_Title
  32.         dc.w    0
  33.  
  34. ***********************************************************
  35. *         OFFSETS TO FUNCTIONS
  36. C_Off       dc.w (L1-L0)/2,(L2-L1)/2,(L3-L2)/2,(L4-L3)/2
  37.             dc.w (L5-L4)/2,(L6-L5)/2,(L7-L6)/2,(L8-L7)/2
  38.             dc.w (L9-L8)/2,(L10-L9)/2,(L11-L10)/2,(L12-L11)/2
  39.                dc.w (L13-L12)/2,(L14-L13)/2,(L15-L14)/2,(L16-L15)/2
  40.             dc.w (L17-L16)/2,(L18-L17)/2,(L19-L18)/2,(L20-L19)/2
  41.         dc.w (L21-L20)/2,(L22-L21)/2,(L23-L22)/2
  42.  
  43. ***********************************************************
  44. *         COMPACTOR TOKENS
  45. C_Tk        dc.w     1,0
  46.         dc.b     $80,-1
  47.         dc.w     L_Pack2,-1
  48.         dc.b     "!pac","k"+$80,"I0t0",-2
  49.         dc.w    L_Pack6,-1
  50.         dc.b    $80,"I0t0,0,0,0,0",-1
  51.         dc.w     L_SPack2,-1
  52.         dc.b     "!spac","k"+$80,"I0t0",-2
  53.         dc.w    L_SPack6,-1
  54.         dc.b    $80,"I0t0,0,0,0,0",-1
  55.         dc.w    L_UPack1,-1
  56.         dc.b    "!unpac","k"+$80,"I0",-2
  57.         dc.w     L_UPack2,-1
  58.         dc.b    $80,"I0t0",-2
  59.         dc.w     L_UPack3,-1
  60.         dc.b    $80,"I0,0,0",-1
  61.         dc.w     0
  62.  
  63. ******************************************************************
  64. *        Start of library
  65. C_Lib
  66.  
  67. ******************************************************************
  68. *        COLD START
  69. L0    moveq    #ExtNb,d0
  70.     rts
  71.  
  72. ******************************************************************
  73. *
  74. L1
  75.  
  76. ******************************************************************
  77. *    
  78. L2
  79.  
  80. ******************************************************************
  81. *        PACK Screen,Bank#
  82. L_Pack2        equ    3
  83. L3    clr.l    -(a3)
  84.     clr.l    -(a3)
  85.     move.l    #10000,-(a3)
  86.     move.l    (a3),-(a3)
  87.     RBra    L_Pack6
  88.  
  89. ******************************************************************
  90. *        PACK Screen,Bank#
  91. L_Pack6        equ    4
  92. L4    Rbsr    L_PacPar
  93.     Rbsr    L_GetSize
  94.     Rbsr    L_ResBank
  95.     Rbsr    L_Pack
  96.     rts
  97.  
  98. *******************************************************************
  99. *        SPACK Screen,Bank#
  100. L_SPack2    equ    5
  101. L5    clr.l    -(a3)
  102.     clr.l    -(a3)
  103.     move.l    #10000,-(a3)
  104.     move.l    (a3),-(a3)
  105.     Rbra    L_SPack6
  106.  
  107. *******************************************************************
  108. *        SPACK Screen,Bank#,X1,Y1 TO X2,Y2
  109. L_SPack6    equ    6
  110. L6    Rbsr    L_PacPar
  111.     Rbsr    L_GetSize
  112.     add.l    #PsLong,d0
  113.     Rbsr    L_ResBank
  114. * Screen definition header
  115.     move.l    #SCCode,(a1)
  116.     move.w    EcTx(a0),PsTx(a1)
  117.     move.w    EcTy(a0),PsTy(a1)
  118.     move.w    EcNbCol(a0),PsNbCol(a1)
  119.     move.w    EcNPlan(a0),PsNPlan(a1)
  120.     move.w    EcCon0(a0),PsCon0(a1)
  121.     move.w    EcAWX(a0),PsAWX(a1)
  122.     move.w    EcAWY(a0),PsAWY(a1)
  123.     move.w    EcAWTX(a0),PsAWTX(a1)
  124.     move.w    EcAWTY(a0),PsAWTY(a1)
  125.     move.w    EcAVX(a0),PsAVX(a1)
  126.     move.w    EcAVY(a0),PsAVY(a1)
  127.     movem.l    a0/a1,-(sp)
  128.     moveq    #31,d0
  129.     lea    EcPal(a0),a0
  130.     lea    PsPal(a1),a1
  131. SPac1    move.w    (a0)+,(a1)+
  132.     dbra    d0,SPac1
  133.     movem.l    (sp)+,a0/a1
  134.     lea    PsLong(a1),a1
  135. * Finish packing!
  136.     Rbsr    L_Pack
  137.     rts
  138.  
  139. *************************************************************************
  140. *        UNPACK Bank#         -> To current screen
  141. L_UPack1    equ    7
  142. L7    move.l    ScOnAd(a5),d0
  143.     Rbeq    L_JFonCall
  144.     move.l    d0,a1
  145.     moveq    #-1,d1
  146.     moveq    #-1,d2
  147.     Rbra    L_UPack
  148.  
  149. *************************************************************************
  150. *        UNPACK Bank#,X,Y    -> To current screen
  151. L_UPack3    equ    8
  152. L8    move.l    ScOnAd(a5),d0
  153.     Rbeq    L_JFonCall
  154.     move.l    d0,a1
  155.     move.l    (a3)+,d2
  156.     move.l    (a3)+,d1
  157.     lsr.l    #3,d1
  158.     Rbra    L_UPack
  159.  
  160. L_UPack        equ    9
  161. L9    movem.l    d1/a1,-(sp)
  162.      move.l    (a3)+,d0
  163.     RJsr    L_Bnk.OrAdr
  164.     movem.l    (sp)+,d1/a1
  165. * Autoback 
  166.     tst.w    EcAuto(a1)        * Is screen autobacked?
  167.     Rbeq    L_UnPack        * NOPE! Do simple unpack
  168.     movem.l    d0-d7/a0-a2,-(sp)    * YEP! First step
  169.     EcCall    AutoBack1
  170.     movem.l    (sp),d0-d7/a0-a2
  171.     btst    #BitDble,EcFlags(a1)    * DOUBLE BUFFER?
  172.     beq.s    ABPac1
  173.     Rbsr    L_UnPack
  174.     EcCall    AutoBack2        * Second step
  175.     movem.l    (sp),d0-d7/a0-a2
  176.     Rbsr    L_UnPack
  177.     EcCall    AutoBack3        * Third step
  178.     bra.s    ABPac2
  179. ABPac1    Rbsr    L_UnPack        * SINGLE BUFFER autobacked
  180.     EcCall    AutoBack4
  181. ABPac2    movem.l    (sp)+,d0-d7/a0-a2
  182.     rts
  183.  
  184. *************************************************************************
  185. *        UNPACK Bank# TO screen    -> Creates/Erases screen!
  186. L_UPack2    equ    10
  187. L10    move.l    (a3)+,d1
  188.     cmp.l    #8,d1
  189.     Rbcc    L_JFoncall
  190. * Creates new screen
  191.     move.l    d1,-(sp)
  192.     move.l    (a3)+,d0
  193.     RJsr    L_Bnk.OrAdr
  194.     move.l    (sp)+,d1
  195.     cmp.l    #SCCode,PsCode(a0)
  196.     Rbne    L_NoScr
  197.     moveq    #0,d2
  198.     moveq    #0,d3
  199.     moveq    #0,d4
  200.     moveq    #0,d5
  201.     move.w    PsTx(a0),d2
  202.     move.w    PsTy(a0),d3
  203.     move.w    PsNPlan(a0),d4
  204.     move.w    PsCon0(a0),d5
  205.     move.w    PsNbCol(a0),d6
  206.     lea    PsPal(a0),a1
  207.     move.l    a0,-(sp)
  208.     EcCall    Cree
  209.     Rbne    L_JOOfMem
  210.     move.l    a0,a1
  211.     move.l    (sp)+,a0
  212.     move.l    a1,ScOnAd(a5)
  213.     move.w    EcNumber(a1),ScOn(a5)
  214.     addq.w    #1,ScOn(a5)
  215. * Enleve le curseur
  216.     movem.l    a0-a6/d0-d7,-(sp)
  217.     lea    CuCuOff(pc),a1
  218.     WiCall    Print
  219.     movem.l    (sp)+,a0-a6/d0-d7
  220. * Change View/Offset
  221.     move.w    PsAWX(a0),EcAWX(a1)
  222.     move.w    PsAWY(a0),EcAWY(a1)
  223.     move.w    PsAWTx(a0),EcAWTx(a1)
  224.     move.w    PsAWTy(a0),EcAWTy(a1)
  225.     move.w    PsAVX(a0),EcAVX(a1)
  226.     move.w    PsAVY(a0),EcAVY(a1)
  227.     move.b    #%110,EcAW(a1)
  228.     move.b    #%110,EcAWT(a1)
  229.     move.b    #%110,EcAV(a1)
  230. * Unpack!
  231.     lea    PsLong(a0),a0
  232.     moveq    #0,d1
  233.     moveq    #0,d2
  234.     Rbra    L_UnPack
  235. CuCuOff    dc.b    27,"C0",0
  236.     even
  237.  
  238. ***********************************************************
  239. *        Reserves memory bank, A1= number
  240. L_ResBank    equ    11
  241. L11    movem.l    a0/d1/d2,-(sp)
  242.     move.l    d0,d2
  243.     moveq    #(1<<Bnk_BitData),d1
  244.     move.l    a1,d0
  245.     lea    BkPac(pc),a0
  246.     Rjsr    L_Bnk.Reserve
  247.     Rbeq    L_JOOfMem
  248.     move.l    a0,a1 
  249.     movem.l    (sp)+,a0/d1/d2
  250.     rts
  251. ******* Definition banque de samples
  252. BkPac:    dc.b "Pac.Pic."
  253.     even
  254.  
  255. ***********************************************************
  256. *        Unpile parameters
  257. L_PacPar    equ    12
  258. L12    move.l    (a3)+,d5
  259.     move.l    (a3)+,d4
  260.     move.l    (a3)+,d3
  261.     move.l    (a3)+,d2
  262.     lsr.w    #3,d4
  263.     lsr.w    #3,d2
  264. * Screen
  265.     move.l    4(a3),d1
  266.     RJsr    L_GetEc
  267.     move.l    d0,a2
  268.     cmp.w    EcTLigne(a0),d4
  269.     bls.s    PacP1
  270.     move.w    EcTLigne(a0),d4
  271. PacP1    cmp.w    EcTy(a0),d5
  272.     bls.s    PacP2
  273.     move.w    EcTy(a0),d5
  274. PacP2    sub.w    d2,d4
  275.     Rble    L_JFoncall
  276.     sub.w    d3,d5
  277.     Rble    L_JFoncall
  278. ; Number of memory bank
  279.     move.l    (a3)+,a1
  280.     cmp.l    #$10000,a1
  281.     Rbcc    L_JFoncall
  282.     addq.l    #4,a3
  283.     rts
  284.  
  285. ***************************************************************************
  286. *       BITMAP COMPACTOR
  287. *                       A0: Origin screen datas
  288. *                       A1: Destination zone
  289. *            A2: Origin screen bitmap
  290. *                       D2: DX in BYTES
  291. *                       D3: DY in LINES
  292. *                       D4: TX in BYTES
  293. *                       D5: TY in LINES
  294. *
  295. ***************************************************************************
  296. *     ESTIMATE THE SIZE OF A PICTURE
  297.  
  298. ******* Makes differents tries
  299. *    And finds the best square size in D1
  300. L_GetSize    equ    13
  301. L13    movem.l    a1-a3,-(sp)
  302.     lea    TSize(pc),a3
  303.     move.l    Buffer(a5),a1
  304.     moveq    #0,d7
  305.     move.w    d5,d7
  306.     clr.w    -(sp)
  307.     move.l    #$10000000,-(sp)
  308. GSize1    move.l    d7,d5
  309.     move.w    (a3)+,d1
  310.     beq.s    GSize2
  311.     divu    d1,d5
  312.     swap    d5
  313.     tst.w    d5
  314.     bne.s    GSize1
  315.     swap    d5
  316.     bsr    PacSize
  317.     cmp.l    (sp),d0
  318.     bcc.s    GSize1
  319.     move.l    d0,(sp)
  320.     move.w    d1,4(sp)
  321.     bra.s    GSize1
  322. GSize2    move.l    (sp)+,d0
  323.     move.w    (sp)+,d1
  324.     move.l    d7,d5
  325.     divu    d1,d5
  326.     movem.l    (sp)+,a1-a3
  327.     rts
  328.  
  329. ******* Simulate a packing
  330. PacSize    movem.l    d1-d7/a0-a6,-(sp)
  331. * Fake data zone
  332.         move.w     d2,Pkdx(a1)
  333.         move.w     d3,Pkdy(a1)  
  334.         move.w     d4,Pktx(a1)  
  335.         move.w     d5,Pkty(a1)   
  336.         move.w     d1,Pktcar(a1)  
  337. * Reserve intermediate table space
  338.     move.w    d1,d0
  339.     mulu    d4,d0
  340.     mulu    d5,d0
  341.     mulu    EcNPlan(a0),d0
  342.     lsr.l    #3,d0
  343.     addq.l    #2,d0
  344.     move.l    d0,-(sp)
  345.     move.l    a0,-(sp)
  346.     Rjsr    L_RamFast
  347.     Rbeq    L_JOofMem
  348.     move.l    (sp)+,a0
  349.     move.l    d0,a6
  350.     move.l    d0,-(sp)
  351. * Prepare registers
  352.         move.l    a2,a4                ;a4--> picture address
  353.         lea     PkDatas1(a1),a5            ;a5--> main datas
  354.     move.w    EcTLigne(a0),d7
  355.     move.w    d7,d5
  356.     mulu    d1,d5            ;d5--> SY line of square
  357.         move.w     Pkdy(a1),d3
  358.         mulu     d7,d3
  359.         move.w     Pkdx(a1),d0
  360.     ext.l    d0
  361.     add.l    d0,d3
  362.     move.w    EcNPlan(a0),-(sp)
  363. * Main packing
  364.         moveq     #7,d1                  * Bit pointer
  365.     moveq    #0,d0
  366. Iplan:  move.l     (a4)+,a3
  367.     add.l    d3,a3
  368.         move.w     Pkty(a1),d6
  369.     subq.w    #1,d6
  370. Iligne: move.l     a3,a2
  371.     move.w    Pktx(a1),d4
  372.     subq.w    #1,d4
  373. Icarre: move.l     a2,a0
  374.         move.w     Pktcar(a1),d2
  375.     subq.w    #1,d2
  376. Ioct0:     cmp.b     (a0),d0             * Compactage d'un carre
  377.         beq.s     Ioct1
  378.     move.b    (a0),d0
  379.         addq.l     #1,a5
  380.         bset     d1,(a6)
  381. Ioct1:  dbra     d1,Ioct2
  382.         moveq     #7,d1
  383.         addq.l     #1,a6
  384.     clr.b    (a6)
  385. Ioct2:  add.w     d7,a0
  386.         dbra     d2,Ioct0
  387.         addq.l    #1,a2    
  388.         dbra     d4,Icarre    
  389.     add.l    d5,a3    
  390.         dbra     d6,Iligne    
  391.     subq.w    #1,(sp)
  392.     bne.s    IPlan
  393.     addq.l    #2,sp
  394.     addq.l    #1,a5
  395. * Packing of first pointers table
  396.     move.l    a5,a6
  397.     move.l    4(sp),d2
  398.     move.l    d2,d0
  399.     subq.w    #1,d2
  400.     lsr.w    #3,d0
  401.     addq.w    #2,d0
  402.     add.w    d0,a5
  403.     move.l    (sp),a0
  404.     moveq    #0,d0
  405.         moveq     #7,d1
  406. Icomp2  cmp.b     (a0)+,d0
  407.         beq.s     Icomp2a
  408.     move.b    -1(a0),d0
  409.         addq.l     #1,a5
  410. Icomp2a dbra    d2,Icomp2
  411. * Final size (EVEN!)
  412.     move.l    a5,d2
  413.     sub.l    a1,d2
  414.     addq.l    #3,d2
  415.     and.l    #$FFFFFFFE,d2
  416. * Free intermediate memory
  417.     move.l    (sp)+,a1
  418.     move.l    (sp)+,d0
  419.     Rjsr    L_RamFree
  420. * Finished!
  421.     move.l    d2,d0
  422.     movem.l    (sp)+,d1-d7/a0-a6
  423.     rts
  424. ******* Packing methods
  425. TSize    dc.w     1,2,3,4,5,6,7,8,12,16,24,32,48,64,0
  426.  
  427.  
  428. ***********************************************************
  429. *    REAL PACKING!!!
  430. L_Pack        equ    14
  431. L14
  432. * Header of the packed bitmap
  433.     movem.l    d1-d7/a0-a6,-(sp)
  434.  
  435. * Packed bitmap header
  436.         move.l     #BMCode,PkCode(a1)
  437.         move.w     d2,Pkdx(a1)
  438.         move.w     d3,Pkdy(a1)  
  439.         move.w     d4,Pktx(a1)  
  440.         move.w     d5,Pkty(a1)   
  441.         move.w     d1,Pktcar(a1)  
  442.     move.w    EcNPlan(a0),PkNPlan(a1)
  443.  
  444. * Reserve intermediate table space
  445.     move.w    d1,d0
  446.     mulu    d4,d0
  447.     mulu    d5,d0
  448.     mulu    EcNPlan(a0),d0
  449.     lsr.l    #3,d0
  450.     addq.l    #2,d0
  451.     move.l    d0,-(sp)
  452.     move.l    a0,-(sp)
  453.     Rjsr    L_RamFast
  454.     Rbeq    L_JOofMem
  455.     move.l    (sp)+,a0
  456.     move.l    d0,a6
  457.     move.l    d0,-(sp)
  458.  
  459. * Prepare registers
  460.         move.l    a2,a4                ;a4--> picture address
  461.         lea     PkDatas1(a1),a5            ;a5--> main datas
  462.     move.w    EcTLigne(a0),d7
  463.     move.w    d7,d5
  464.     mulu    d1,d5            ;d5--> SY line of square
  465.         move.w     Pkdy(a1),d3
  466.         mulu     d7,d3
  467.         move.w     Pkdx(a1),d0
  468.     ext.l    d0
  469.     add.l    d0,d3
  470.     move.w    EcNPlan(a0),-(sp)
  471.  
  472. * Main packing
  473.         moveq     #7,d1                  * Bit pointer
  474.     moveq    #0,d0
  475.         clr.b     (a5)                  * First byte to zero
  476.         clr.b     (a6)              
  477. plan:   move.l     (a4)+,a3
  478.     add.l    d3,a3
  479.         move.w     Pkty(a1),d6
  480.     subq.w    #1,d6
  481. ligne:  move.l     a3,a2
  482.     move.w    Pktx(a1),d4
  483.     subq.w    #1,d4
  484. carre:  move.l     a2,a0
  485.         move.w     Pktcar(a1),d2
  486.     subq.w    #1,d2
  487. oct0:     cmp.b     (a0),d0             * Compactage d'un carre
  488.         beq.s     oct1
  489.     move.b    (a0),d0
  490.         addq.l     #1,a5
  491.         move.b     d0,(a5)
  492.         bset     d1,(a6)
  493. oct1:   dbra     d1,oct2
  494.         moveq     #7,d1
  495.         addq.l     #1,a6
  496.         clr.b     (a6)
  497. oct2:   add.w     d7,a0
  498.         dbra     d2,oct0
  499.         addq.l    #1,a2            * Carre suivant en X
  500.         dbra     d4,carre    
  501.     add.l    d5,a3            * Ligne suivante
  502.         dbra     d6,ligne    
  503.     subq.w    #1,(sp)            * Plan couleur suivant
  504.     bne.s    Plan
  505.     addq.l    #2,sp
  506.     addq.l    #1,a5
  507.  
  508. ; Packing of first pointers table
  509.     move.l    a5,d0
  510.     sub.l    a1,d0
  511.     move.l    d0,PkPoint2(a1)
  512.     move.l    a5,a6
  513.     move.l    4(sp),d0
  514.     move.l    d0,d2
  515.     subq.w    #1,d2
  516.     lsr.w    #3,d0
  517.     addq.w    #2,d0
  518.     add.w    d0,a5
  519.     move.l    a5,d0
  520.     sub.l    a1,d0
  521.     move.l    d0,PkDatas2(a1)
  522.     move.l    (sp),a0
  523.     moveq    #0,d0
  524.         moveq     #7,d1
  525.         clr.b     (a5)
  526.         clr.b     (a6)
  527. comp2:  cmp.b     (a0)+,d0
  528.         beq.s     comp2a
  529.     move.b    -1(a0),d0
  530.         addq.l     #1,a5
  531.         move.b     d0,(a5)
  532.         bset     d1,(a6)
  533. comp2a: dbra     d1,comp2b
  534.         moveq     #7,d1
  535.         addq.l     #1,a6
  536.         clr.b     (a6)
  537. comp2b: dbra    d2,Comp2
  538.  
  539. * Free intermediate memory
  540.     move.l    (sp)+,a1
  541.     move.l    (sp)+,d0
  542.     RJsr    L_RamFree
  543.     movem.l    (sp)+,d1-d7/a0-a6
  544.     rts
  545.  
  546. ***********************************************************
  547. *        Bitmap unpacker
  548. *        A0-> packed picture
  549. *        A1-> Destination screen
  550. *        D1.L Start in X
  551. *        D2.L Start in Y
  552. UAEc:    equ 0
  553. UDEc:    equ 4
  554. UITy:    equ 8
  555. UTy:    equ 10
  556. UTLine:    equ 12
  557. UNPlan:    equ 14
  558. UPile:    equ 16
  559. L_UnPack    equ    15
  560. L15    movem.l    a0-a6/d1-d7,-(sp)
  561.  
  562. * Jump over SCREEN DEFINITION
  563.     cmp.l    #SCCode,(a0)
  564.     bne.s    dec0
  565.     lea    PsLong(a0),a0
  566. * Is it a packed bitmap?
  567. dec0    cmp.l    #BMCode,(a0)
  568.     Rbne    L_NoPac
  569.  
  570. * Parameter preparation
  571.     lea    -UPile(sp),sp        * Space to work
  572.     lea    EcCurrent(a1),a2
  573.     move.l    a2,UAEc(sp)        * Bitmaps address
  574.         move.w     EcTLigne(a1),d7        * d7--> line size
  575.     move.w    EcNPlan(a1),d0        * How many bitplanes
  576.     cmp.w    PkNPlan(a0),d0
  577.     Rbne    L_JFoncall
  578.     move.w    d0,UNPlan(sp)
  579.     move.w    Pktcar(a0),d6        * d6--> SY square
  580.  
  581.         tst.l     d1            * Screen address in X
  582.         bpl.s     dec1
  583.         move.w     Pkdx(a0),d1
  584. dec1:   tst.l     d2            * In Y
  585.         bpl.s     dec2
  586.         move.w     Pkdy(a0),d2
  587. dec2:   move.w    Pktx(a0),d0
  588.     add.w    d1,d0
  589.     cmp.w    d7,d0
  590.     Rbhi    L_JFoncall
  591.     move.w    Pkty(a0),d0
  592.     mulu    d6,d0
  593.     add.w    d2,d0
  594.     cmp.w    EcTy(a1),d0
  595.     Rbhi    L_JFoncall
  596.  
  597.     mulu    d7,d2            * Screen address
  598.     ext.l    d1    
  599.     add.l    d2,d1
  600.     move.l    d1,UDEc(sp)
  601.     
  602.     move.w    d6,d0            * Size of one line
  603.         mulu     d7,d0
  604.         move     d0,UTLine(sp)
  605.  
  606.         move.w     Pktx(a0),a3        * Size in X
  607.         subq.w    #1,a3
  608.         move.w     Pkty(a0),UITy(sp)    * in Y
  609.         lea     PkDatas1(a0),a4            * a4--> bytes table 1
  610.         move.l     a0,a5
  611.         move.l     a0,a6
  612.         add.l     PkDatas2(a0),a5         * a5--> bytes table 2
  613.         add.l     PkPoint2(a0),a6         * a6--> pointer table
  614.  
  615.         moveq     #7,d0            
  616.         moveq     #7,d1
  617.         move.b     (a5)+,d2
  618.         move.b     (a4)+,d3
  619.         btst     d1,(a6)
  620.         beq.s     prep
  621.         move.b     (a5)+,d2
  622. prep:   subq.w     #1,d1
  623.  
  624. * Unpack!
  625. dplan:  move.l     UAEc(sp),a2
  626.     addq.l    #4,UAEc(sp)
  627.     move.l    (a2),a2
  628.     add.l    UDEc(sp),a2
  629.         move.w     UITy(sp),UTy(sp)    * Y Heigth counter
  630. dligne: move.l     a2,a1
  631.         move.w     a3,d4
  632. dcarre: move.l     a1,a0
  633.         move.w     d6,d5           * Square height
  634. doctet1:subq.w     #1,d5
  635.         bmi.s     doct3
  636.         btst     d0,d2
  637.         beq.s     doct1
  638.         move.b     (a4)+,d3
  639. doct1:  move.b     d3,(a0)
  640.         add.w     d7,a0
  641.         dbra     d0,doctet1
  642.         moveq     #7,d0
  643.         btst     d1,(a6)
  644.         beq.s     doct2
  645.         move.b     (a5)+,d2
  646. doct2:  dbra     d1,doctet1
  647.         moveq     #7,d1
  648.         addq.l     #1,a6
  649.         bra.s     doctet1
  650. doct3:  addq.l    #1,a1               * Other squares?
  651.         dbra     d4,Dcarre
  652.         add.w     UTLine(sp),a2              * Other square line?
  653.         subq.w     #1,UTy(sp)
  654.         bne.s     Dligne
  655.         subq.w     #1,UNPlan(sp)
  656.         bne.s     Dplan
  657.         lea    UPile(sp),sp            * Restore the pile
  658. * Finished!
  659.     movem.l    (sp)+,a0-a6/d1-d7
  660.     rts
  661.  
  662.  
  663. ***********************************************************
  664. *        JUMP TO ERROR MESSAGES
  665. L_JFoncall    equ    16
  666. L16    moveq    #23,d0
  667.     RJmp    L_Error
  668. L_JScnop    equ    17
  669. L17    moveq    #47,d0
  670.     RJmp    L_Error
  671. L_JOOfmem    equ    18
  672. L18    moveq    #24,d0
  673.     RJmp    L_Error
  674.  
  675. ***********************************************************
  676. *        ERROR HANDLING
  677. L_NoPac        equ    19
  678. L19    moveq    #0,d0
  679.     RBra    L_Custom
  680. L_NoScr        equ    20
  681. L20    moveq    #1,d0
  682.     RBra    L_Custom
  683.  
  684. ***********************************************************
  685. *        ERROR MESSAGES
  686.  
  687. ******* First routine
  688. L_Custom    equ    21
  689. L21    lea    ErrMes(pc),a0
  690.     moveq    #0,d1
  691.     moveq    #ExtNb,d2
  692.     moveq    #0,d3
  693.     RJmp    L_ErrorExt
  694. ErrMes    dc.b     "Not a packed bitmap",0
  695.     dc.b     "Not a packed screen",0
  696.     even    
  697. ******* Second routine
  698. L22    moveq    #0,d1
  699.     moveq    #ExtNb,d2
  700.     moveq    #0,d3
  701.     RJmp    L_ErrorExt
  702. L23
  703.  
  704. ***********************************************************
  705. *         Welcome message
  706. C_Title        dc.b     "AMOSPro Picture Compactor V "
  707.         Version
  708.         dc.b    0,"$VER: "
  709.         Version
  710.         dc.b    0
  711.         Even
  712.  
  713. ***********************************************************
  714. C_End    dc.w    0
  715.  
  716.  
  717.